技巧102 记录Docker日志的输出

正如所见,Docker 提供了基本的日志记录系统来获取用户的容器的启动命令的输出。如果你是一名在一台宿主机上运行着多个服务的系统管理员,那么手工轮流在每个容器上执行 docker logs 命令来跟踪并获取日志操作起来可能很是烦琐。

在本技巧中,我们会讲解一下Docker的日志驱动程序特性。这让我们能够使用标准的日志记录系统来追踪某台宿主机(乃至跨多台宿主机)上的很多服务。

问题

想要在Docker宿主机上集中获取 docker logs 的输出。

解决方案

使用 -–log driver 标志重定向日志到需要的地方。

在默认情况下,Docker日志是在Docker守护进程内部被捕获的,可以通过 docker logs 命令来查看。读者可能已经注意到了,这展示的是容器主进程的输出。

编写本书时,Docker为重定向该输出到多个 日志驱动程序 提供了若干选择,包括:

  • syslog;
  • journald;
  • json-file。

默认设置是json-file,但是其他两项也可以通过 --log-driver 标志来选择。syslog和journald选项会把日志输出发送到各自同名的守护进程。在Docker官方网站上可以找到所有可用的日志驱动程序的官方文档。

警告

本技巧需要Docker 1.6.1或更高版本。

syslog守护进程是运行在服务器上的一个进程,它会收集并管理发送到一个中心文件(通常是一个Unix域套接字)的所有消息。它一般会使用/dev/log作为接收日志消息的文件,并且把日志记录到/var/log/syslog。

journald是一个收集并存储日志记录数据的系统服务。它为不同来源的日志创建并维护一个结构严密的索引。这些日志可以通过 journalctl 命令来查询。

1.记录日志到syslog

为了把输出定向到syslog,需要使用 --log-driver 标志:

$ docker run --log-driver=syslog ubuntu echo 'outputting to syslog'
outputting to syslog

这会将输出记录在syslog文件中。如果有访问该文件的权限,可以通过标准Unix工具来检查这些日志:

$ grep 'outputting to syslog' /var/log/syslog
Jun 23 20:37:50 myhost docker/6239418882b6[2559]: outputting to syslog
2.记录日志到journald

输出到journal守护进程看起来类似这样:

$ docker run --log-driver=journald ubuntu echo 'outputting to journald'
outputting to journald
$ journalctl | grep 'outputting to journald'
Jun 23 11:49:23 myhost docker[2993]: outputting to journald

警告

确保在执行前面的命令之前宿主机上有一个journal守护进程在运行。

3.对所有的容器应用这些命令

为宿主机上所有的容器应用这一参数可能会十分费力,因此设置Docker守护进程默认输出日志到这些受支持的机制。

更改守护进程的/etc/default/docker,或者/etc/sysconfig/docker,或者用户自己的发行版设置的Docker配置文件。激活 DOCKER_OPTS="" 这一行,添加 --log-driver 标志。例如,如果这一行是

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

就变为

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --log-driver syslog"

提示

参见附录B以了解如何在宿主机上改变Docker守护进程的配置。

如果重启了Docker守护进程,容器会记录日志到相关服务。

讨论

另一个在这种情境下值得一提的通常做法(但在这里未做讲解)是可以使用容器实现一个ELK(Elasticsearch、Logstash和Kibana)日志记录基础设施。

警告

把守护进程的设置改成 json-fliejournald 之外的任何东西都将意味着默认情况下标准的 docker logs 命令将不起作用了。此Docker守护进程的用户可能并不喜欢这个变化,尤其是/var/log/syslog文件(被 syslog 驱动程序使用)通常对非root用户来说是无法访问的。

results matching ""

    No results matching ""